package cn.bearspark.happening.provider.service;

import cn.bearspark.common.dto.Page;
import cn.bearspark.happening.dto.happening.ForwardReqDTO;
import cn.bearspark.happening.dto.happening.LCFNumInfoDTO;
import cn.bearspark.happening.dto.happening.ModifyReqDTO;
import cn.bearspark.happening.dto.happening.PublishHappeningReqDTO;
import cn.bearspark.happening.provider.dao.co.HappeningCO;
import cn.bearspark.happening.provider.service.bo.HappeningBO;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 动态模块
 *
 * @author f
 */
public interface HappeningService {

    /**
     * 发布动态
     *
     * @param publishHappeningReqDTO 发布动态的请求的数据传输对象
     * @return 动态的 id
     */
    long publish(PublishHappeningReqDTO publishHappeningReqDTO);

    /**
     * 获取用户及其关注者的部分动态，按照发布时间降序排列
     *
     * @param userId         用户的 id
     * @param followerIdList 用户关注者的 id 的集合
     * @param pageNum        动态的页数
     * @param pageSize       动态的条数
     * @return 用户及其关注者的部分动态
     */
    Page<HappeningBO> pageQuerySAF(long userId, List<Long> followerIdList, int pageNum, int pageSize);

    /**
     * 分页查询指定用户的动态信息
     *
     * @param operatorId 执行查询操作的用户 id
     * @param userId     指定的用户 id
     * @param pageNum    动态的页数
     * @param pageSize   动态的条数
     * @return 指定用户的动态分页查询信息
     */
    List<HappeningBO> pageQueryByUserId(long operatorId, long userId, int pageNum, int pageSize);

    /**
     * 转发动态
     *
     * @param forwardReqDTO 转发动态的请求的数据传输对象
     * @return 动态的 id
     */
    long forward(ForwardReqDTO forwardReqDTO);

    /**
     * 查询引用的动态信息
     *
     * @param quotedHappeningIdSet 待查询的引用动态的 id 的 Set 集合
     * @return 引用的动态信息集合
     */
    List<HappeningBO> listQuoteHappeningInfo(Set<Long> quotedHappeningIdSet);

    /**
     * 获取指定 动态的业务对象 和 它引用的动态的业务对象
     *
     * @param userId      获取指定动态的用户 id，用于判断该用户是否有权限查看指定动态
     * @param happeningId 指定动态的 id
     * @return 指定 动态的业务对象 和 它引用的动态的业务对象，如果用户没有权限，则会返回空集合
     */
    List<HappeningBO> detail(long userId, long happeningId);

    /**
     * 动态点赞/取消点赞
     *
     * @param userId      进行操作的用户 id
     * @param happeningId 指定的动态 id
     * @param liked       点赞/取消点赞的值
     */
    void like(long userId, long happeningId, int liked);

    /**
     * 删除动态
     *
     * @param userId      进行操作的用户 id
     * @param happeningId 待删除的动态 id
     * @return 待删除动态的数据，如果该用户没有权限删除，则返回 null
     */
    HappeningCO delete(long userId, long happeningId);

    /**
     * 修改动态
     *
     * @param modifyReqDTO 修改动态请求的数据传输对象
     */
    void modify(ModifyReqDTO modifyReqDTO);

    /**
     * 增加动态的评论数
     *
     * @param happeningId 待增加评论数的动态 id
     */
    void incrCommentNum(long happeningId);

    /**
     * 减少动态的评论数
     *
     * @param happeningId 待减少评论数的动态 id
     * @param decrement   减少的评论数
     */
    void decrCommentNum(long happeningId, long decrement);

    /**
     * 获取指定动态的点赞数
     *
     * @param happeningId 指定动态的 id
     * @return 指定动态的点赞数
     */
    long getLikeNum(long happeningId);

    /**
     * 获取指定动态的转发数
     *
     * @param happeningId 指定动态的 id
     * @return 指定动态的转发数
     */
    long getForwardNum(long happeningId);

    /**
     * 获取指定动态的评论数
     *
     * @param happeningId 指定动态的 id
     * @return 指定动态的评论数
     */
    long getCommentNum(long happeningId);

    /**
     * 定时发布动态的回调接口
     *
     * @param infoList 额外信息的集合
     */
    void onHappeningDeadline(List<String> infoList);

    /**
     * 判断指定动态是否可评论
     *
     * @param happeningId 指定的动态 id
     * @return 指定动态是否可评论
     */
    boolean isCommentable(long happeningId);

    /**
     * 查询指定动态的 点赞量、评论量、转发量 信息
     *
     * @param happeningId 指定的动态 id
     * @return 指定动态的 点赞量、评论量、转发量 信息
     */
    LCFNumInfoDTO getLCFNumInfo(long happeningId);

    /**
     * 映射指定动态的 点赞量、评论量、转发量 信息
     *
     * @param happeningIdList 指定的动态 id 集合
     * @return 指定动态的 点赞量、评论量、转发量 信息
     */
    Map<Long, LCFNumInfoDTO> mapLCNumInfo(List<Long> happeningIdList);
}
